package com.neusoft.tools;

import com.neusoft.nep.entity.nepsFeedback;

import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


/**
 * 公众监督员反馈工具类
 */
public final class FeedbackUtils {
    private static final String LOG_FILE_PATH = "src/resource/data/feedbacks_detailed.log";
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    /**
     * 从日志文件中读取所有的反馈记录，并将它们转换为一个对象列表。
     *
     * @return 一个包含所有有效反馈记录的Map
     */
    public static List<nepsFeedback> getAllFeedback() {
        List<nepsFeedback> entries = new ArrayList<>();
        File file = new File(LOG_FILE_PATH);
        if (!file.exists()) {
            return entries;
        }

        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            String line;
            while ((line = reader.readLine()) != null) {

                String[] parts = line.split(",", 9);
                if (parts.length == 9) {

                    entries.add(new nepsFeedback(Integer.parseInt(parts[0]), parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]));
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return entries;
    }
    /**
     * 将一条新的、完整的用户反馈记录追加到日志文件中。
     * @param username      提交反馈的用户名
     * @param phoneNumber   用户的手机号，作为唯一标识符
     * @param province      用户选择的省份
     * @param city          用户选择的城市
     * @param address       用户填写的详细地址
     * @param level         用户预估的污染等级
     * @param content       用户填写的详细反馈内容
     */
    public static void addFeedback(String username, String phoneNumber, String province, String city, String address, String level, String content) {
        String currentDate = LocalDateTime.now().format(FORMATTER);
        String safeAddress = address.replace(",", "，").replace("\n", " ");
        String safeContent = content.replace(",", "，").replace("\n", " ");
        String logEntry = String.join(",",
                Integer.toString(getAllFeedback().size()+1) , username, phoneNumber, province, city, safeAddress, level, safeContent, currentDate
        );

        try (BufferedWriter writer = new BufferedWriter(new FileWriter(LOG_FILE_PATH, true))) {
            writer.write(logEntry);
            writer.newLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 根据指定的手机号，筛选并获取该用户的所有反馈记录。
     *
     * @param phoneNumber 需要查询的用户的手机号，应为非空字符串。
     * @return 一个只包含指定用户反馈记录的列表。如果该用户没有任何反馈，则返回一个空列表。
     */
    public static List<nepsFeedback> getFeedbackForUser(String phoneNumber) {
        return getAllFeedback().stream()
                .filter(entry -> entry.getPhoneNumber().equals(phoneNumber))
                .collect(Collectors.toList());
    }
    /**
     * 根据指定的手机号，筛选并获取该用户的所有反馈记录。
     *
     * @param city 需要查询的用户的手机号，应为非空字符串。
     * @return 一个只包含指定用户反馈记录的列表。如果该用户没有任何反馈，则返回一个空列表。
     */
    public static List<nepsFeedback> getFeedbackForProvince(String city) {
        return getAllFeedback().stream()
                .filter(entry -> entry.getCity().equals(city))
                .collect(Collectors.toList());
    }
    /**
     * 统计并返回每个用户（按手机号区分）提交的反馈总数。
     *
     * @return 一个 {@code Map}，其中键（Key）是用户的手机号，值（Value）是该用户提交的反馈总数。
     */
    public static Map<String, Long> countFeedbackByUser() {
        return getAllFeedback().stream()
                .collect(Collectors.groupingBy(nepsFeedback::getPhoneNumber, Collectors.counting()));
    }
}